/********************************************************************************
* File Name:	player.cpp
* Description:	第12章实例训练          
* Reference book:《Linux环境下Qt4图形界面与MySQL编程》，机械工业出版社.2012.1  
* E_mail: openlinux2011@gmail.com		                
*
********************************************************************************/
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPixmap>
#include "player.h"
#include "ui_player.h"

//播放器窗口类构造函数
Player::Player(QWidget *parent) :QMainWindow(parent),ui(new Ui::Player),p(NULL),puri(NULL),standardItemModel(new QStandardItemModel())
{
    QHBoxLayout *hLayout; //水平布局类
    QHBoxLayout *hLayout2; //水平布局类
    QVBoxLayout *vLayout; //垂直布局

    ui->setupUi(this);

    media = new Phonon::MediaObject; //播放器对象
    vwidget = new Phonon::VideoWidget(ui->centralwidget); //播放界面
    Phonon::createPath(media, vwidget); //将media与vwidget连接
    vwidget->setAspectRatio(Phonon::VideoWidget::AspectRatioAuto); //设置可播放的文件类型
    aOutput = new Phonon::AudioOutput(Phonon::VideoCategory); //视频音频输出类对象
    Phonon::createPath(media, aOutput); //将media与aOutput连接
    volumeSlider = new Phonon::VolumeSlider; //声音控制类对象
    volumeSlider->setAudioOutput(aOutput); //设置控制对象
    volumeSlider->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); //设置声音最大最小范围
    seekSlider = new Phonon::SeekSlider; //播放进度控制类
    seekSlider->setMediaObject(media); //设置控制对象

    /*设置按钮*/
    /*进行页面布局，分别是横向和纵向的布局*/
    /*设置播放窗口，play，pause，stop，volume按钮的布局*/
    hLayout = new QHBoxLayout; //水平布局
    hLayout->addWidget(ui->pbPlay); //添加Play按钮
    hLayout->addWidget(ui->pbPause); //添加Pause按钮
    hLayout->addWidget(ui->pbStop); //添加Stop按钮
    hLayout->addWidget(seekSlider); //添加播放进度控件
    hLayout->addWidget(ui->lbVolume); //添加显示框
    hLayout->addWidget(volumeSlider); //添加声音控制控件

    vLayout = new QVBoxLayout; //垂直布局
    vLayout->addWidget(vwidget); //添加播放器界面
    vLayout->addLayout(hLayout); //将hLayout加入vLayout布局中

    hLayout2 = new QHBoxLayout; //水平布局
    hLayout2->addLayout(vLayout); //将vLayout加入hLayout2中
    hLayout2->addWidget(ui->lvPlayList); //添加播放列表
    hLayout2->setAlignment(ui->lvPlayList,Qt::AlignRight); //播放列表右对齐
    ui->centralwidget->setLayout(hLayout2); //设置播放器界面的布局格式

    /*打开时加载历史播放列表*/
    for(int i = 0; i < managepl.getOriginListCount(); i++)
    {
        QString filecompletename = managepl.getOneFilePath(i);//获取第i条历史记录的文件路径
        int begin = filecompletename.lastIndexOf("/"); //查找路径中最后一个字符'/'的位置
        QStandardItem* item = new QStandardItem(filecompletename.mid(begin+1));//获取文件的名，除去路径部分
        standardItemModel->appendRow(item); //向standardItemModel中插入新的行
    }
    ui->lvPlayList->setModel(standardItemModel); //将信息以试图的形式显示
}
Player::~Player()
{
    if(p)
        delete p;
    if(puri)
        delete puri;
    delete ui;
}
void Player::play()//播放文件
{
    media->play();
}

void Player::stop() //取消播放
{
    media->stop();
}

void Player::pause() //暂停播放
{
    media->pause();
}


void Player::setPath()//打开文件并播放，设置支持的格式
{
   QString path=QFileDialog::getOpenFileName(this, tr("Open Image"), ".", tr("Moive(*.avi *.rmvb *.flv);;Music(*.mp3 *.wma)")); //选择特定格式的文件
   if(path.length()!=0) //判断是否选择文件
   {
       filePath=path;
       media->setCurrentSource(Phonon::MediaSource(filePath)); //设置播放源
       media->play(); //播放文件
       QFileInfo info(filePath);
       QString fileName = info.completeBaseName()+"."+info.completeSuffix(); //获取文件的名，除路径部分和后缀名
       qint32 index = managepl.indexOf(filePath); //判断此文件播放列表中是否存在
       if(index == -1) //不存在
       {
           QStandardItem* item = new QStandardItem(fileName); //将此文件加入播放列表
           standardItemModel->appendRow(item);
           ui->lvPlayList->setModel(standardItemModel);
           ui->lvPlayList->setSelectionRectVisible(true);
           managepl.obtainCurrentFilePath(filePath);
       }
   }
}
void Player::incSound() //增大声音
{
    qreal incStep = 0.1;
    qreal curVolume = this->volumeSlider->audioOutput()->volume();
    this->volumeSlider->audioOutput()->setVolume(curVolume + incStep);
}
void Player::decSound() //减小声音
{
    qreal incStep = 0.1;
    qreal curVolume = this->volumeSlider->audioOutput()->volume();
    this->volumeSlider->audioOutput()->setVolume(curVolume - incStep);
}
void Player::myGrabWindow()//截屏,以图片的形式保存截屏
{
    QPixmap pixmap;
    media->pause();
    pixmap = pixmap.grabWindow(vwidget->winId());
    QString format =".png"; //通过文件对话框来获得保存的路径与名称。
    QString fileName=QFileDialog::getSaveFileName(this,"Save Picture",QDir::currentPath());
    fileName.append(format);
    pixmap.save(fileName);
    media->play();
}
void Player::hideShowListView() //隐藏、显示播放列表
{
    if(ui->acOpPlayList->text() == "隐藏播放列表")
    {
        ui->lvPlayList->hide();  //隐藏播放列表
        ui->acOpPlayList->setText("显示播放列表");
    }
    else if(ui->acOpPlayList->text() == "显示播放列表")
    {
        ui->lvPlayList->show(); //显示播放列表
        ui->acOpPlayList->setText("隐藏播放列表");
    }
}
void Player::showProperty() //显示当期播放文件的属性
{
    if(!p)
    {
        p = new FileProperty(); //如果当前p为NULL，则创建新的对象
    }
    if(filePath.length() != 0) //当前播放文件存在
    {
        p->showMovieProperty(filePath); //显示文件属性
    }
}
void Player::uriOpenFile() //根据给定路径打开文件
{
    if(!puri)
    {
        puri = new PathURI(); //创建新的对象
    }
    puri->show();
    puri->exec();//等待puri窗口的退出
    if((puri->GetFilePath())=="")
         return;
    else
        filePath = puri->GetFilePath(); //获取输入的文件路径

    QFileInfo info(filePath); //新的文件对象
    filePath = info.absoluteFilePath(); //获取问价的绝对路径

    media->setCurrentSource(Phonon::MediaSource(filePath));//设置当前播放的文件
    media->play(); //播放选定的文件

    /*在不重复的情况下，设置显示在listview中的文件名，和插入到vector中的文件路径*/
    QString fileName = info.completeBaseName()+"."+info.completeSuffix(); //获取文件的名，出去路径和后缀
    qint32 index = managepl.indexOf(filePath); //查看文件在播放列表中是否存在
    if(index == -1) //不存在，将文件加入播放列表
    {
        QStandardItem* item = new QStandardItem(fileName);
        standardItemModel->appendRow(item);
        ui->lvPlayList->setModel(standardItemModel);
        managepl.obtainCurrentFilePath(filePath);
    }
}
void Player::fullNormalScreen()//对全屏进行操作，在全屏时，默认是隐藏播放列表
{
    if(ui->acFullScreen->isVisible()) //全屏
    {
        ui->acFullScreen->setVisible(false);
        ui->acNormalScreen->setVisible(true);
        ui->lvPlayList->hide();
        ui->acOpPlayList->setText("显示播放列表");
    }
    else //非全屏
    {
        ui->acFullScreen->setVisible(true);
        ui->acNormalScreen->setVisible(false);
    }
}
void Player::clearPlayList()//清空播放列表
{
    standardItemModel->clear();
    managepl.clear();
}
void Player::selectedMoivePlay() //播放在播放列表中被双击的文件
{
    int index=ui->lvPlayList->currentIndex().row(); //获取被双击文件的行号
    filePath=managepl.getOneFilePath(index);
    media->setCurrentSource(Phonon::MediaSource(filePath)); //设置播放源
    media->play(); //进行播放
}
